#coding=utf-8
#并发编程：进程，线程，协程

#1.进程：程序并不能单独运行，只有将程序装载到内存中，系统为它分配资源才能运行，而这种执行的程序就称之为进程。
# 程序和进程的区别就在于：程序是指令的集合，它是进程运行的静态描述文本；进程是程序的一次执行活动，属于动态概念。
# 同一个程序执行两次是两个进程。
#进程是计算机中的程序关于某数据集合上的一次运行活动，是系统进行资源分配和调度的基本单位，是操作系统结构的基础。


#进程编程，记得要建立一个主进程 __name=='__main__',
#通过Queue进行进程间通信,通过Lock获取锁:lock.acquire()和lock.release(),获取锁和释放锁,保证数据在被修改阶段，无法被别的进程所获取
#terminate()和is_alive() 终止和判断是否还存活

from multiprocessing import Process,Queue,Lock
import time
import threading
def task1(queue,lock,*key):
    print("Process 1 start")
    while True:
        a= queue.get()
        print("Process 1 receicve data:{}".format(a))
        if a==99:
            break



def task2(queue,lock,*key):
    print("Process 2 start")
    data=0
    while True:
        queue.put(data)
        print("Process 2 send data:{}".format(data))
        data=data+1
        time.sleep(0.1)
        if data==100:
            break

#带锁的多线程
note=100
def addnote(lock,num):
    lock.acquire()
    global note 
    note=note+num
    print(u"充值{}元,已充值到{}元".format(num,note))
    lock.release()
def sellnote(lock,num):
    lock.acquire()
    global note
    if note<num:
        print(u"余额不足，请充值，余额为{}，需要消费{}".format(note,num))
    else:
        note=note-num
        print(u"消费{}元，余额为{}元".format(num,note))
    lock.release()

import os
#进程的类方法,重写run方法，调用方法:MyProcess.start 或者 MyProcess.run
class MyProcess(Process):
    def __init__(self):
        super(self,MyProcess).__init__()
        self.name=100
    def run(self):
        print("进程为%s，父进程为%s" % (os.getpid(), os.getppid()))


# #进程池
# import time
# from multiprocessing import Pool
# def run(num):
#     '''
#     计算num的num次方
#     :param num: 数字
#     :return: num的num次方
#     '''
#     time.sleep(1)
#     return num ** num
 
 
# if __name__ == '__main__':
#     lst = [1, 2, 3, 4, 5, 6]
#     print("顺序：")
#     t_one = time.time()
#     for fn in lst:
#         run(fn)
#     t_two = time.time()
#     print("执行时间：", t_two - t_one)
 
#     print("多进程：")
#     pool = Pool(5)
#     res = pool.map(run, lst)
#     pool.close()
#     pool.join()
#     t_thr = time.time()
#     print("执行时间：", t_thr - t_two)
#     print(res)

if __name__=='__main__':
    lock=Lock()
    add_list=[]
    sell_list=[]
    for i in range(10):
        add_list.append(threading.Thread(target=addnote,args=(lock, i)))
    for i in range(10):
        sell_list.append(threading.Thread(target=sellnote,args=(lock, i)))
    for i in range(10):
        add_list[i].start()
        sell_list[i].start()
    # queue=Queue()
    # process1=Process(target=task1,args=(queue,'arg1'))
    # process2=Process(target=task2,args=(queue,'arg2'))

    # process1.start()
    # process2.start()
    # process1.join()





